package model

import (
	"chatOnline/common/message"
	"encoding/json"
	"fmt"
	"github.com/garyburd/redigo/redis" // 引入redis包
)

// 我们在服务器启动后，就初始化一个usrdao 实例
// 把它做成全局的变量，在需要和redis操作时，就直接使用即可
var (
	MyUserDao *UserDao
)

type UserDao struct {
	pool *redis.Pool
}

func NewUserDao(pool *redis.Pool)(userDao *UserDao) {
	userDao = &UserDao{
		pool: pool,
	}
	return

}

// UserDao 应该提供的方法
func (this *UserDao) getUserById(conn redis.Conn,id int)(user *message.User,err error)  {
	//通过给定的id 去redis 查询这个用户
	res,err := redis.String(conn.Do("HGet","users",id))

	if err != nil{
		//错误
		if err == redis.ErrNil{
			err = ERROR_USER_NOTEXISTS
		}
		return
	}

	// 这里需要把res 反序列化成 user
	user = &message.User{}
	err = json.Unmarshal([]byte(res),user)
	if err !=nil {
		fmt.Println("json.Unmarshal.err=",err)
		return
	}

	return

}

// 完成登录校验
// 1.Login 完成对用户的校验
// 2. 如果用户的id 和pwd 都正确，则返回一个user实例
// 3 . 如果用户的id 或pwd 有错误，则返回对应的错误信息
func (this *UserDao)Login(userId int,userPwd string)(user *message.User,err error)  {

	// 先从UserDao 的连接池中取出一根连接
	conn := this.pool.Get()
	defer conn.Close()

	user,err =this.getUserById(conn,userId)
	if err !=nil {
		return
	}

	if user.UserPwd != userPwd{
		err = ERROR_USER_PWD
		return
	}
	return
}


func (this *UserDao)Register(user *message.User)(err error)  {

	// 先从UserDao 的连接池中取出一根连接
	conn := this.pool.Get()
	defer conn.Close()

	_,err =this.getUserById(conn,user.UserId)
	if err ==nil {
		err = ERROR_USER_EXISTS
		return
	}
	// 有错则表示 redis 无此用户 ，未注册
	data,err :=json.Marshal(user)
	if err != nil{
		return
	}
	// 入库
	_,err = conn.Do("HSet","users",user.UserId,string(data))
	if err != nil{
		fmt.Println("保存注册用户 错误 err=",err)
	}
	return
}